/*
*********************************************************************************************************
*
*	模块名称 : 主程序模块
*	文件名称 : main.c
*	版    本 : V1.0
*	说    明 : 跑马灯。
*              实验目的：
*                1. 学习H7平台的跑马灯实现。
*              实验内容：
*                1、启动一个自动重装软件定时器，每100ms翻转一次LED1和LED2。
*                2、再启动一个自动重装软件定时器，每500ms翻转一次LED3和LED4。
*              注意事项：
*                1. 本实验推荐使用串口软件SecureCRT查看打印信息，波特率115200，数据位8，奇偶校验位无，停止位1。
*                2. 务必将编辑器的缩进参数和TAB设置为4来阅读本文件，要不代码显示不整齐。
*
*	修改记录 :
*		版本号   日期         作者        说明
*		V1.0    2018-12-12   Eric2013     1. CMSIS软包版本 V5.4.0
*                                         2. HAL库版本 V1.3.0
*
*	Copyright (C), 2018-2030, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/	

/*------------------------------------------------------------------------------
 Section: Includes
 ------------------------------------------------------------------------------*/
/* 底层硬件驱动头文件 */
#include "bsp.h"			


/* 应用程序头文件 */
#include "include/Demo_SDRAM_test.h"
#include "include/LCD.h"
#include "include/led.h"
#include "include/key.h"
#include "include/beep.h"
#include "include/timer.h"
#include "include/demo_sd_fatfs.h"
#include "include/sram.h"
#include "include/uart.h"
#include "include/pwm.h"
#include "include/adc.h"
/*------------------------------------------------------------------------------
 Section: Macro Definitions
 ------------------------------------------------------------------------------*/	
/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME	"V7-跑马灯"
#define EXAMPLE_DATE	"2022-7-29"
#define DEMO_VER		"1.0"

/*------------------------------------------------------------------------------
 Section: Type Definitions
 ------------------------------------------------------------------------------*/	
/* None */	

/*------------------------------------------------------------------------------
 Section: Global Function prototypes
 ------------------------------------------------------------------------------*/	
/* None */

/*------------------------------------------------------------------------------
 Section: Local Function prototypes
 ------------------------------------------------------------------------------*/	
static void PrintfLogo(void);
static void PrintfHelp(void);

/*------------------------------------------------------------------------------
 Section: Global Variables
 ------------------------------------------------------------------------------*/	
/* None */

/*------------------------------------------------------------------------------
 Section: Local Variables
 ------------------------------------------------------------------------------*/	

uint8_t lowerpower_flag;

/*
*********************************************************************************************************
*	函 数 名: _Go
*	功能说明: 
*	形    参: 无
*	返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/

static void _Go(void)
{
	PrintfLogo();
	PrintfHelp();
}


/*
*********************************************************************************************************
*	函 数 名: PrintfHelp
*	功能说明: 打印操作提示
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static void PrintfHelp(void)
{
	printf("操作提示:\r\n");
	printf("1. 启动一个自动重装软件定时器，每100ms翻转一次LED1和LED2\r\n");
	printf("2. 再启动一个自动重装软件定时器，每500ms翻转一次LED3和LED4\r\n");
}

/*
*********************************************************************************************************
*	函 数 名: PrintfLogo
*	功能说明: 打印例程名称和例程发布日期, 接上串口线后，打开PC机的超级终端软件可以观察结果
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static void PrintfLogo(void)
{
	printf("*************************************************************\n\r");
	
	/* 检测CPU ID */
	{
		uint32_t CPU_Sn0, CPU_Sn1, CPU_Sn2;
		
		CPU_Sn0 = *(__IO uint32_t*)(0x1FF1E800);
		CPU_Sn1 = *(__IO uint32_t*)(0x1FF1E800 + 4);
		CPU_Sn2 = *(__IO uint32_t*)(0x1FF1E800 + 8);

		printf("\r\nCPU : STM32H743XIH6, BGA240, FREQ: %dMHz\r\n", SystemCoreClock / 1000000);
		printf("UID = %08X %08X %08X\n\r", CPU_Sn2, CPU_Sn1, CPU_Sn0);
	}

	printf("\n\r");
	printf("*************************************************************\n\r");
	printf("* EXAMPLE_NAME	: %s\r\n", EXAMPLE_NAME);	/* 打印例程名称 */
	printf("* DEMO_VER		: %s\r\n", DEMO_VER);		/* 打印例程版本 */
	printf("* EXAMPLE_DATE 	: %s\r\n", EXAMPLE_DATE);	/* 打印例程日期 */

	/* 打印ST的HAL库版本 */
	printf("* HAL_VERSION: V1.3.0 (STM32H7xx HAL Driver)\r\n");
	printf("* \r\n");	/* 打印一行空格 */
	printf("*************************************************************\n\r");
}


/*
*********************************************************************************************************
*	函 数 名: LowerPower_task
*	功能说明: 
*	形    参: 无
*	返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
static void LowerPower_task(void)
{	
	if(lowerpower_flag)
	{
		HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
		SystemClock_Config();
	}

}


/*
*********************************************************************************************************
*	函 数 名: main
*	功能说明: c程序入口
*	形    参: 无
*	返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{


	bsp_Init();		/* 硬件初始化 */
	_Go();

	//SDRAM test
	FmcSDRAM_Test(); /* 外部SDRAM读写测试 */
	
	/* 进入主程序循环体 */
	while (1)
	{
		bsp_Idle();		/* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
		
		//LED
		LED_task();
		
		//Key
		Key_task();
		
		//Beep
//		Beep_task();

		//Timer
		Timer_task();

		//SRAM
		SRAM_task();

		//DTCM
		DTCM_Malloc_task();

		//UART
		Uart_task();

		//PWM TIM
		PWM_task();

		//Lower Power Mode
		LowerPower_task();

		//ADC task
		ADC_task();
		
		//LCD task
		LCD_Task();
		
		//FatFs
		DemoFatFS();
	}
}


